//引入async模块
const async = require('async')
//引入静态常量模块
const Constant = require('../constant/constant.js')

/**
 * 深度克隆方法
 * @date 2021-03-13
 * @param {any} obj
 * @returns {any}
 */
function clone(obj) {
  return JSON.parse(JSON.stringify(obj))
}

/**
 * 校验参数全局方法，检验params是否有checkArr中的所有参数
 * @date 2021-03-13
 * @param {any} params 请求的参数对象{a:'',b:'',c:''}
 * @param {any} checkArr 需要验证的参数 [a,b] p[a]
 * @param {any} cb 回调函数
 */
function checkParams(params, checkArr, cb) {
  let flag = true
  for (let i = 0; i < checkArr.length; i++) {
    if (!params[checkArr[i]]) {
      flag = false
      break
    }
  }
  if (flag) {
    cb(null)
  } else {
    cb(Constant.LACK)
  }
}

/**
 * 返回统一的方法，返回json数据
 * @date 2021-03-13
 * @param {any} tasks
 * @param {any} res
 * @param {any} resObj
 * @returns {any}
 */
function autoFn(tasks, res, resObj) {
  async.auto(tasks, function (err) {
    if (err) {
      console.log(JSON.stringify(err))
      res.json({
        code: err.code || Constant.DEFAULT_ERROR.code,
        msg: err.msg || JSON.stringify(err),
      })
    } else {
      res.json(resObj)
    }
  })
}

//对参数进行验证
function validateGetCasesParams(params, cb) {
  let { page, rows, houseType, fitType, area, price, name } = params
  //验证page
  let reg = /^\d+$/
  if (!reg.test(page)) {
    cb({ code: 401, msg: `page值必须是正整数` })
    return false
  }
  if (area) {
    if (!reg.test(area)) {
      cb({ code: 406, msg: `area值必须是正整数` })
      return false
    }
  }
  if (price) {
    if (!reg.test(price)) {
      cb({ code: 407, msg: `price值必须是正整数` })
      return false
    }
  }
  if (!reg.test(rows)) {
    cb({ code: 402, msg: `rows值必须是正整数` })
    return false
  }
  if (houseType) {
    let arr = ['二居室', '三居室', '四居室', '别墅', '复式', '大户型', '小户型', '平层', 'loft']
    if (arr.indexOf(houseType) === -1) {
      cb({ code: 403, msg: `房型值不合法` })
      return false
    }
  }
  if (fitType) {
    let arr = [
      '现代',
      '中式',
      '美式',
      '轻奢',
      '北欧',
      '简约',
      '法式',
      '混搭',
      '欧式',
      '新中式',
      '新古典',
      '地中海',
      '田园',
      '宜家',
      '日式',
    ]
    if (arr.indexOf(fitType) === -1) {
      cb({ code: 405, msg: `风格值不合法` })
      return false
    }
  }
  if (name) {
    let reg = /^[\u4e00-\u9fa5]{2,}$/
    if (!reg.test(name)) {
      cb({ code: 405, msg: '查询标题是汉字至少2个字符' })
      return false
    }
  }
  return true
}

module.exports = {
  autoFn,
  clone,
  checkParams,
  validateGetCasesParams,
}
